//Interrupt handler (Codename "Haber-Bosch")

#include "interrupt_handler.h"
#include "asmcode.h"
#include "serial.h"
#include "system_timer.h"
#include "lib.h"


#define STACKLENGTH 1000

unsigned char irqstack[STACKLENGTH];

long int seconds;

void enableAICInterrupts(){
    seconds = 0;
    //write("0x18 setzen\n");
    *InterruptVectorAddress = OPCODE;  //Sprungadresse im arm an 0x18 setzen
    //printf("IRQ-Stack (%x) setzen\n",((int)irqstack )+STACKLENGTH*4);
    int i = initIRQStack(((int)irqstack )+STACKLENGTH*4);
    //printf("Inhalt von verändertem CPSR: %x\n",i);
//     write("Handlerfunktionsadresse setzen\n");
    *AIC_SVR1 = (int)&timeHandler;
//     printf("timeHandler-Adresse: %x, Inhalt von AIC_SVR1: %x, Inhalt von 0x18: %x\n, handler-Adresse: %x, irqstack-Adresse: %x\n", (int)&timeHandler,*AIC_SVR1,*InterruptVectorAddress,(int)&handler, (int)irqstack);
//     write("aktivieren des Interrupts vom AIC\n");
    *AIC_IECR = SYS;		//enabelt Interrupts im AIC
//     write("CPSR Interrupts enablen\n");
    enableCPSR();		//Enabledt Interupts im CPSR
}

//aktiviert Software-Interrrrubzßst im SWI_OPCODE wird LDR PC,PC 0x100, dadurch wird ein Sprung an die Adresse unserer Interruptbehandlung realisiert
void enableSWI(){
	*SWIJumpAddress = &timeHandler;
	printf("timeHandler-Adresse: %x\n",&timeHandler);
	*SWIVectorAddress = SWI_OPCODE;  //Sprungadresse im arm an 0x08 setzen
	
}

void remap(){
    *MC_RCR = RCB;
}


void handler(){
	
	printf("%d!\n",seconds++);
	*AIC_EOICR = 1; //AIC_EOICR schreiben, um anzuzeigen, dass Interrupt beendet wurde. Geschriebener Inhalt ist egal
	*ST_SR; //ST_SR lesen um anzuzeigen, dass Interrupt bearbeitet wurde (oder so ähnlich, vll wars auch was anderes!)
  
}






